/*  Copyright © 2009 Blake Hegerle -*- C++ -*- */

/*  This file is part of metal.
 
    Metal is free software: you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see
    <http://www.gnu.org/licenses/>.

*/

#include "metal.h"
using namespace metal;
using namespace metal::driver;
using namespace std;

namespace {
  ident(f);
  ident(g);
  ident(h);
  ident(func);
  ident(x);
}

void functor_tests() {
  cout << "functor_tests" << endl;

  mod(functor_mod,

      f = def() ( -1 ),

      g = def() ( 1 ),

      h = def(param(int, x)) ( eval(func(), func = cond(x < 0, f, g)) )

      );

  auto program = link(functor_mod);

  assert(program.call(h)(0) == 1);
  assert(program.call(h)(1) == 1);
  assert(program.call(h)(2) == 1);
  assert(program.call(h)(-3) == -1);
}
